/*
gorm

建表语句
CREATE TABLE  gorm_user (
   id INTEGER PRIMARY KEY AUTO_INCREMENT,
   name VARCHAR(64) NULL,
   gender VARCHAR(1) NULL,
   hobby VARCHAR(256) NULL
);

*/
package main

import (
	"fmt"

	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
)

// UserInfo 用户信息
type UserInfo struct {
	ID     uint   `gorm:"primary_key"`
	Name   string `gorm:"name"`
	Gender string `gorm:"gender"`
	Hobby  string `gorm:"hobby:varchar(256);"`
}

func (UserInfo) TableName() string {
	//实现TableName接口，以达到结构体和表对应，如果不实现该接口，并未设置全局表名禁用复数，gorm会自动扩展表名为userInfos（结构体+s）
	return "gorm_user"
}

func main() {
	// db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
	db, err := gorm.Open("mysql", "root:@(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}
	defer db.Close()

	// 自动迁移
	//db.AutoMigrate(&UserInfo{})

	// 删除全部数据，方便重复运行
	db.Model(&UserInfo{}).Delete(UserInfo{})

	u1 := UserInfo{0, "小明", "男", "篮球"}
	u2 := UserInfo{0, "小红", "女", "足球"}
	u3 := UserInfo{0, "小亮", "男", "足球"}
	// 创建记录
	db.Create(&u1)
	fmt.Println("u1:", u1)
	db.Create(&u2)
	fmt.Println("u2:", u2)
	db.Create(&u3)
	fmt.Println("u3:", u3)

	// 查询
	var u = new(UserInfo)
	db.First(u)
	fmt.Println("First u:", u)
	var uu []UserInfo
	//db.Find(&uu, "hobby=?", "足球")
	db.Where(&UserInfo{Hobby: "足球"}).Find(&uu)
	fmt.Println("Find uu:", uu)

	// 更新
	//db.Model(&u).Update("hobby", "双色球")
	fmt.Println("Update before u:", u)
	db.Model(&u).Update(UserInfo{Hobby: "双色球"})
	fmt.Println("Update after u:", u)

	// 删除
	//db.Where(xxx).Delete(UserInfo{})
	//db.Delete(&u)

}
